package com.spring.demo10.eg3;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.core.env.MapPropertySource;

import java.util.Map;

/**
 * @author vhans
 */
public class RefreshConfigUtil {
    // 模拟改变数据库中的配置信息
    public static void updateDbConfig(AbstractApplicationContext context) {
        // 更新context中的mailPropertySource配置信息
        refreshMailPropertySource(context);
        // 来清除BeanRefreshScope中所有已经缓存的bean
        BeanRefreshScope.clean();

        // 这样，调用bean的任意方法的时候，会重新出发spring容器来创建bean，spring容器重新创建bean的时候，会重新解析
        // @Value的信息，此时容器中的邮件配置信息是新的，所以@Value注入的信息也是新的
    }

    public static void refreshMailPropertySource(AbstractApplicationContext context) {
        // 新获取一个MailInfo
        Map<String, Object> mailInfoFromDb = DbUtil1.getMailInfoFormDb();

        // 通过MapPropertySource将信息加入Environment中
        MapPropertySource mailSource = new MapPropertySource("mail", mailInfoFromDb);
        context.getEnvironment().getPropertySources().addFirst(mailSource);
    }
}
